package com.yuzhi.fine.ui.loopviewpager;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.PagerAdapter;
import android.util.AttributeSet;
import android.view.MotionEvent;
import java.lang.ref.WeakReference;
/**
* Created by tiansj on 15/8/7.
* 继承LoopViewPager,增加handle触发自动循环,并对事件进行处理,按下停止播放,抬起开始播放
*/
public class AutoLoopViewPager extends LoopViewPager {
public static final int DEFAULT_INTERVAL = 4000;
public static final int SCROLL_WHAT = 0;
private long interval = DEFAULT_INTERVAL;
private Handler handler;
public AutoLoopViewPager(Context context) {
super(context);
init();
}
public AutoLoopViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
handler = new MyHandler(this);
startAutoScroll();
}
private static class MyHandler extends Handler {
private final WeakReference<AutoLoopViewPager> autoScrollViewPager;
public MyHandler(AutoLoopViewPager autoScrollViewPager) {
this.autoScrollViewPager = new WeakReference<AutoLoopViewPager>(autoScrollViewPager);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SCROLL_WHAT:
AutoLoopViewPager pager = this.autoScrollViewPager.get();
if (pager != null) {
pager.scrollOnce();
pager.sendScrollMessage(pager.interval);
}
default:
break;
}
}
}
/**
* <ul>
* if stopScrollWhenTouch is true
* <li>if event is down, stop auto scroll.</li>
* <li>if event is up, start auto scroll again.</li>
* </ul>
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = MotionEventCompat.getActionMasked(ev);
if (action == MotionEvent.ACTION_DOWN) {
stopAutoScroll();
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
startAutoScroll();
}
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
/**
* scroll only once
*/
public void scrollOnce() {
PagerAdapter adapter = getAdapter();
int currentItem = getCurrentItem();
int totalCount;
if (adapter == null || (totalCount = adapter.getCount()) <= 1) {
return;
}
int nextItem = ++currentItem;
if (nextItem < 0) {
setCurrentItem(totalCount - 1);
} else if (nextItem == totalCount) {
setCurrentItem(0);
} else {
setCurrentItem(nextItem);
}
}
/**
* start auto scroll, first scroll delay time is 4s
*/
public void startAutoScroll() {
sendScrollMessage(interval);
}
/**
* start auto scroll
*
* @param delayTimeInMills first scroll delay time
*/
public void startAutoScroll(int delayTimeInMills) {
sendScrollMessage(delayTimeInMills);
}
/**
* stop auto scroll
*/
public void stopAutoScroll() {
handler.removeMessages(SCROLL_WHAT);
}
private void sendScrollMessage(long delayTimeInMills) {
/** remove messages before, keeps one message is running at most **/
handler.removeMessages(SCROLL_WHAT);
handler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills);
}
public void setInterval(long interval) {
this.interval = interval;
}
}